Managing dependencies in your PHP projects can be a real nightmare. The language depends on so many underlying system libraries and kernel features that in reality, PHP is almost more Linux and Apache than it is its own language. If you've ever worked in an environment where you need to deploy websites to multiple clients on various assorted hosting, you know how painful this can be.
Enter PHPFeatureCheck - a utility which can run on almost any platform (really, any configuration
of PHP so long as it's not running in safe mode) that allows you to create non-intrusive feature
detection files as *.INI
's which you can then run a script against to check that your application
will work.
Simply create a featurecheck.ini
file in any of your project's directories. The featurechecker
script is invoked with a path to a directory to process - it will recurse all directories
and run all checks in any featurecheck.ini
files encountered.
php check.php /my/project/root
,
or
check.php?project=/my/project/root
Format is that of regular *.ini files, with the following differences:
- Header sections are used as the name of each requirement
- Sections may specify the following parameters before their comment section:
- optional (bool): specifies an optional requirement
- category (string): specifies the name of a group to show this requirement under. Use the same category string for multiple requirements to group them together
- allowwarning (bool): interprets a raised warning on this requirement as success rather than failure
- anyincategory (bool): modifies the behaviour of all requirements assigned to this category so that only 1 must pass to validate. This parameter MUST be specified AFTER the category name.
- Comments (lines starting with #) immediately following headers & params will display as the error text of the feature when it is not met
- All non-comment lines before the next header section are PHP code to evaluate for the test. Generally this code should use 'return' to pass back the success status of the requirement.
[curl] optional = true category = Remote HTTP requests anyincategory = true # cURL is required for performing remote HTTP requests return function_exists('curl_init'); [sockets] optional = true category = Remote HTTP requests anyincategory = true # Sockets are required for performing remote HTTP requests return function_exists('fsockopen'); [git] # We need git installed (and in PATH) for some reason return FeatureChecker::ProgramInstalled('git'); [error] # Failures are not only detected by returning FALSE. Any errors also result in a fail. Nonexistent__CLass->get();
FeatureCheck itself requires the following (fairly minimal) prerequisites:
- PHP >= 4.0.0
- however prior to 4.0.1 warnings cannot be differentiated from fatal errors
- Not running in safe mode
- Sockets enabled
When running requirement checks from CLI, any errors from the requirement checks will be output before the final results list.